package com.gitee.taotaojs.mybootsuper.mapper;

import com.gitee.taotaojs.mybootsuper.bean.BaseBean;
import org.apache.ibatis.annotations.DeleteProvider;
import org.apache.ibatis.annotations.InsertProvider;
import org.apache.ibatis.annotations.MapKey;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.SelectProvider;
import org.apache.ibatis.annotations.UpdateProvider;
import tk.mybatis.mapper.annotation.RegisterMapper;

import java.util.List;
import java.util.Map;

/**
 * 通用Mapper继承父类
 * @author TaoTaojs
 * @date 2020年03月20日15:49:46
 * <p>Description</p>
 * 主要是统一继承类，减少配置
 * 关联类:
 * 参考链接：
 */
@RegisterMapper
public interface MyComMapper<T extends BaseBean> extends MyBasicMapper<T>, BeanMapper<T> {

    /**
     * 批量创建
     * @param mysql 复杂mysql对象
     * @param isIgnore 是否跳过插入失败的数据（多线程有死锁风险）
     * @return 执行成功条数
     */
    @InsertProvider(type= MyComProvider.class, method="dynamicSQL")
    Integer insertObjList(@Param("mysql") MySqlBuild<T> mysql, @Param("isIgnore") Boolean isIgnore);

    /**
     * 批量删除
     * @param mysql 复杂mysql对象
     * @return 执行成功条数
     */
    @DeleteProvider(type= MyComProvider.class, method="dynamicSQL")
    Integer deleteObjList(@Param("mysql") MySqlBuild<T> mysql);

    /**
     * 批量更新
     * @param mysql 复杂mysql对象
     * @return 执行成功条数
     */
    @UpdateProvider(type= MyComProvider.class, method="dynamicSQL")
    Integer updateObjList(@Param("mysql") MySqlBuild<T> mysql);

    /**
     * 根据多条件查找
     * @param mysql 复杂mysql对象
     * @return 数据列表
     */
    @SelectProvider(type= MyComProvider.class, method="dynamicSQL")
    List<T> selectObjList(@Param("mysql") MySqlBuild<T> mysql);

    /**
     * 根据多条件查找并返回Map对象
     * @param mysql 复杂mysql对象
     * @param <K> key泛型
     * @return 以id为key的map
     */
    @SelectProvider(type= MyComProvider.class, method="dynamicSQL")
    @MapKey("id")
    <K> Map<K, T> selectObjMap(@Param("mysql") MySqlBuild<T> mysql);

}
